home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 26 / AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso / Tools / Packer / PPCUnACE / Src / portable.h < prev    next >
C/C++ Source or Header  |  1999-03-29  |  3KB  |  108 lines

  1. /****************************************************************/
  2. /*                                                              */
  3. /*   A collection of routines used in making ACE portable for   */
  4. /*   different computers                                        */
  5. /*                                                              */
  6. /****************************************************************/
  7.  
  8. #ifndef __portable_h
  9. #define __portable_h
  10.  
  11. #include "os.h"
  12.  
  13. #ifdef  HI_LO_BYTE_ORDER
  14.  
  15. /* All kinds of inplace swap routines, to reverse from LOHI to HILO byte order */
  16.  
  17. #ifdef AMIGA
  18.  
  19. #if __SASC && __VERSION__>=6 && __REVISION__>=58
  20.  
  21. #define WORDswap(n)  (*(n) = __builtin_rol(*(n), 8, 1))
  22. #define LONGswap(n)  ( WORDswap(&((WORD *)(n))[0]),\
  23.                        WORDswap(&((WORD *)(n))[1]),\
  24.                        *(n) = __builtin_rol(*(n), 16, 2) )
  25. #else /* __SASC */
  26.  
  27. #define EORSWAP
  28.  
  29. #endif /* !__SASC */
  30.  
  31. #endif /* AMIGA  */
  32.  
  33.  
  34. #ifdef EORSWAP
  35.  
  36. /*  With some compilers and processors these work faster then the
  37.  *  regular swap below, for example on a Amiga 68040 using SAS C 6.58.
  38.  *  But using builtin rotates works even faster, see above.
  39.  */
  40.  
  41. #define WORDswap(n) (((BYTE*)(n))[0] ^= ((BYTE*)(n))[1],\
  42.                      ((BYTE*)(n))[1] ^= ((BYTE*)(n))[0],\
  43.                      ((BYTE*)(n))[0] ^= ((BYTE*)(n))[1])
  44. #define LONGswap(n) (((BYTE*)(n))[0] ^= ((BYTE*)(n))[3],\
  45.                      ((BYTE*)(n))[3] ^= ((BYTE*)(n))[0],\
  46.                      ((BYTE*)(n))[0] ^= ((BYTE*)(n))[3],\
  47.                      ((BYTE*)(n))[1] ^= ((BYTE*)(n))[2],\
  48.                      ((BYTE*)(n))[2] ^= ((BYTE*)(n))[1],\
  49.                      ((BYTE*)(n))[1] ^= ((BYTE*)(n))[2])
  50. #endif  /* EORSWAP */
  51.  
  52. #ifndef WORDswap
  53.  
  54. /* If not yet defined use the standard swaps */
  55.  
  56. #define WORDswap(n)  (*(n) = (*(n) << 8) | (*(n) >> 8))
  57. #define LONGswap(n)  ( WORDswap(&((WORD *)(n))[0]),\
  58.                        WORDswap(&((WORD *)(n))[1]),\
  59.                        *(n) = (*(n) >> 16) | (*(n) << 16) )
  60. #endif /* WORDSWAP */
  61.  
  62. #endif /* HI_LO_BYTE_ORDER */
  63.  
  64.  
  65. /* GENERIC: Convert to LONG or WORD from BYTE-Pointer-to-LOHI-byte-order data,
  66.  *          without worrying if the bytes are word alined in memory.
  67.  *  p is a pointer to char.
  68.  */
  69.  
  70. #ifdef HI_LO_BYTE_ORDER
  71.  
  72. #define BUFP2WORD(p) ((UWORD)*(p)++ | ((*(p)++)<<8))
  73. #define BUFP2LONG(p) ((ULONG)*(p)++ | ((*(p)++)<<8) | ((*(p)++)<<16) | ((*(p)++)<<24))
  74.  
  75. #define BUF2WORD(p) ((UWORD)*(p) | (*((p)+1)<<8))
  76. #define BUF2LONG(p) ((ULONG)*(p) | (*((p)+1)<<8) | (*((p)+2)<<16) | (*((p)+3)<<24))
  77.  
  78. #else /* HI_LO_BYTE_ORDER */
  79.  
  80. #define BUFP2WORD(p) *(UWORD*)((p+=2)-2)
  81. #define BUFP2LONG(p) *(ULONG*)((p+=4)-4)
  82.  
  83. #define BUF2WORD(p) (*(UWORD*)p)
  84. #define BUF2LONG(p) (*(ULONG*)p)
  85.  
  86. #endif /* !HI_LO_BYTE_ORDER */
  87.  
  88. /* Timestamp macros */
  89.  
  90. #define get_tx(m,d,h,n) (((ULONG)m<<21)+((ULONG)d<<16)+((ULONG)h<<11)+(n<<5))
  91. #define get_tstamp(y,m,d,h,n,s) ((((ULONG)(y-1980))<<25)+get_tx(m,d,h,n)+(s/2))
  92.  
  93. #define ts_year(ts)  ((UINT)((ts >> 25) & 0x7f) + 1980)
  94. #define ts_month(ts) ((UINT)(ts >> 21) & 0x0f)      // 1..12 means Jan..Dec
  95. #define ts_day(ts)   ((UINT)(ts >> 16) & 0x1f)      // 1..31 means 1st..31st
  96. #define ts_hour(ts)  ((UINT)(ts >> 11) & 0x1f)
  97. #define ts_min(ts)   ((UINT)(ts >> 5) & 0x3f)
  98. #define ts_sec(ts)   ((UINT)((ts & 0x1f) * 2))
  99.  
  100. #ifdef NOTELL
  101.   #ifdef tell
  102.     #undef tell
  103.   #endif
  104.   #define tell(_fd) lseek(_fd, 0, SEEK_CUR)
  105. #endif
  106.  
  107. #endif /* __portable_h */
  108.